/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cids.custom.switchon;
import org.apache.log4j.Logger;
import org.jfree.chart.ChartColor;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.TextAnchor;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.List;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
/**
* DOCUMENT ME!
*
* @author jlauter
* @version $Revision$, $Date$
*/
public class RaineventChartPanel extends javax.swing.JPanel {
//~ Static fields/initializers ---------------------------------------------
private static final Logger LOG = Logger.getLogger(RaineventChartPanel.class);
//~ Instance fields --------------------------------------------------------
private final transient Rainevent rainevent;
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel pnlChart;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form RaineventChartPanel.
*
* @param rainevent DOCUMENT ME!
*/
public RaineventChartPanel(final Rainevent rainevent) {
this.rainevent = rainevent;
initComponents();
init();
}
//~ Methods ----------------------------------------------------------------
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
final java.awt.GridBagConstraints gridBagConstraints;
pnlChart = new javax.swing.JPanel();
setOpaque(false);
setLayout(new java.awt.GridBagLayout());
pnlChart.setOpaque(false);
pnlChart.setLayout(new java.awt.BorderLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(pnlChart, gridBagConstraints);
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*/
private void init() {
final List<Double> data = rainevent.getPrecipitations();
final Integer interval = rainevent.getInterval();
try {
if (pnlChart != null) {
pnlChart.removeAll();
final BarChart chart = new BarChart(data, interval);
chart.setBorder(new LineBorder(Color.black, 1));
pnlChart.add(chart, BorderLayout.CENTER);
}
Component parent = RaineventChartPanel.this.getParent();
Component current = RaineventChartPanel.this;
while (parent != null) {
current = parent;
parent = parent.getParent();
}
if (current instanceof JFrame) {
((JFrame)current).pack();
} else {
current.invalidate();
current.validate();
}
} catch (Exception ex) {
LOG.error("Cannot create BarChart", ex);
}
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class BarChart extends JPanel {
//~ Constructors -------------------------------------------------------
/**
* Creates a new BarChart object.
*
* @param data DOCUMENT ME!
* @param interval DOCUMENT ME!
*/
public BarChart(final List<Double> data, final int interval) {
final DefaultCategoryDataset dataset = createDataset(data, interval);
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart, false);
this.setLayout(new BorderLayout());
this.add(chartPanel, BorderLayout.CENTER);
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param data DOCUMENT ME!
* @param interval DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalStateException DOCUMENT ME!
*/
private DefaultCategoryDataset createDataset(final List<Double> data, final int interval) {
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// // row keys
final List<Double> values = data;
int steps = interval;
// Zwei Nachkommastellen im englischen Format
final NumberFormat nf = new DecimalFormat("#0.00", new DecimalFormatSymbols(Locale.ENGLISH));
for (final Double value : values) {
try {
final String s = nf.format(value.doubleValue());
final Double valueFormated = new Double(s);
dataset.addValue(valueFormated.doubleValue(), "[" + Unit.L_S_HA + "]", String.valueOf(steps));
steps += interval;
} catch (NumberFormatException e) {
final String message = "Cannot format double value";
throw new IllegalStateException(message, e);
}
}
return dataset;
}
/**
* DOCUMENT ME!
*
* @param dataset DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private JFreeChart createChart(final DefaultCategoryDataset dataset) {
final JFreeChart chart = ChartFactory.createBarChart(
null,
org.openide.util.NbBundle.getMessage(
RaineventChartPanel.class,
"RaineventChartPanel.createChart(DefaultCategoryDataset).xAxis"),
org.openide.util.NbBundle.getMessage(
RaineventChartPanel.class,
"RaineventChartPanel.createChart(DefaultCategoryDataset).yAxis"),
dataset,
PlotOrientation.VERTICAL,
false,
false,
false);
// set the background color for the chart...
chart.setBackgroundPaint(Color.white);
// get a reference to the plot for further customisation...
final CategoryPlot plot = chart.getCategoryPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
// set the range axis to display integers only...
final NumberAxis rangeAxis = (NumberAxis)plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setUpperMargin(0.15);
final StackedBarRenderer renderer = new StackedBarRenderer(false);
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.OUTSIDE12,
TextAnchor.BOTTOM_CENTER));
renderer.setSeriesPaint(0, ChartColor.VERY_LIGHT_BLUE);
renderer.setShadowVisible(false);
chart.getCategoryPlot().setRenderer(renderer);
return chart;
}
}
}